#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <fcntl.h>

using namespace std;

#define buffer_size 1024
// 全局变量
const char *w_message = "i am father!";
char buffer[buffer_size];

// 封装的父进程写入函数
void father_process_w(int wfd)
{
    ssize_t bytes_w = write(wfd, w_message, strlen(w_message));

    if (bytes_w == -1)
    {
        cerr << "写入失败！" << endl;
        close(wfd);
        exit(-1);
    }
}
// 封装的子进程读取函数
void child_process_r(int rfd)
{
    ssize_t bytes_r = read(rfd, buffer, 1024 - 1);

    if (bytes_r == -1)
    {
        cout << "读取失败！" << endl;
        close(rfd);
        exit(-1);
    }
    buffer[bytes_r] = '\0'; // 确保字符串以null结尾（尽管read通常不会超出文件末尾）
}

int main()
{
    // 1、创建匿名管道
    int pipefd[2]; // 创建一个Pipefd数组，里面只有两个元素：0读，1写
    int n = pipe(pipefd);
    if (n != 0)
    {
        cout << "管道创建失败！" << endl;
        exit(-1);
    }

    // 3、创建子进程(子进程r数据)
    pid_t id = fork();
    if (id == 0) // 子进程
    {
        close(pipefd[1]);
        child_process_r(pipefd[0]);
        // child读取完成之后，打印到屏幕上！

        cout << "\n下面是读取到的内容" << endl;

        cout << buffer << endl;
        
        close(pipefd[0]);
    }
    else
    {
        // 2、首先父进程w数据
        close(pipefd[0]);
        father_process_w(pipefd[1]);
        close(pipefd[1]);
    }
    return 0;
}